package com.example.java_chatroom.api;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.io.Serializable;
import java.util.UUID;

public class PasswordUtils implements Serializable {
    /**
     * 1、加盐生成密码
     * @param password 前端传来的明文密码
     * @return  返回加盐加密后的密码存储到数据库中
     */
    public static  String encrypt(String password){
        //通过uuid得到32位盐值
        String salt= UUID.randomUUID().toString().replace("-","");
        //生成加盐后的密码,将盐值和password进行md5加密
        String saltPassword= DigestUtils.md5DigestAsHex((salt+password).getBytes());
        //生成最终密码（保存到数据库中）[约定为：32位盐值+"$"+32为md5加密后的加盐密码]
        String finalPassword=salt+"$"+saltPassword;
        return finalPassword;
    }

    /**
     * 2、自己指定盐值生成密码（方便后续进行测试，上面方法的重载）
     * @param password 明文密码
     * @param salt     自定义盐值
     * @return         返回最终的密码
     */
    public static String encrypt(String password,String salt){
        //1、进行加盐密码的md5加密
        String saltPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes());
        //2、生成最终密码
        String finalPassword= salt+"$"+saltPassword;
        return finalPassword;
    }

    /**
     * 3、验证密码（比对用户输入的密码和数据库中的密码是否相同）
     * @param inputPassword 用户输入的密码
     * @param finalPassword 数据库中加密后的密码
     * @return
     */
    public static boolean check(String inputPassword,String finalPassword){
        //非空校验
        if(StringUtils.hasLength(inputPassword)&&StringUtils.hasLength(finalPassword)
            &&finalPassword.length()==65){
            //1、得到盐值
            String salt=finalPassword.split("\\$")[0];
            //2、将盐值和用户输入的明文密码进行加密，生成最终的加密后的密码
            String confirmPassword=encrypt(inputPassword,salt);
            //3、比对数据库密码和用户输入的密码进行加密后的结果是否相同
            return confirmPassword.equals(finalPassword);
        }
        return false;
    }


    public static void main(String[] args) {
        String password="123456";
        String finalPassword=encrypt(password);
        System.out.println("加密后的密码："+finalPassword);
        System.out.println(check(password,finalPassword));
    }
}
